﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WpfApp3.Models;
using SqlSugar;
using System.Windows.Controls;
using System.IO;
using System.Windows;
using System.Diagnostics;
//理解了原生sql，配合ORM,操控数据库的方法，像是汇编加上c语言，提高了简洁性，可读性
//同时仍然可以使用原生sql语言精准控制，类似对原生sql语言添加了库调用达到更加简单的写sql语句
//当 ORM 无法满足需求时，可像 “嵌入汇编代码” 一样使用原生 SQL直接操作数据库指令

//但代码结构太简单，没必要再重构使用和刻意添加ORm;SQlSguar的写法控制数据库，控制数据库时也很少用到，
//比如查询，查询功能在persons集合中已经用c#原生语言完成，数据库只需要增删改，当然这是项目太小和代码结构的问题
//大型项目或者中等类型，大部分使用ORM




namespace WpfApp3.Data
{
    public class SqlSugarManager
    {
        private static readonly string DbPath = Path.Combine(
      AppDomain.CurrentDomain.BaseDirectory,
      "Sqlguar",
      "ORMdata.db");
       
        /// <summary>
        /// 确保数据库和表已初始化
        /// </summary>
        private  void EnsureDatabaseInitialized()
        {

            try
            {
                // 从连接字符串中提取目录部分
                string dbDirectory = Path.GetDirectoryName(DbPath);
                if (!Directory.Exists(dbDirectory))
                {
                    Directory.CreateDirectory(dbDirectory);
                }

                // 执行数据库连接和表创建
                CreateTableIfNotExists();
                MessageBox.Show("ORM数据库初始化成功");
            }
            catch (Exception ex)
            {
                MessageBox.Show($"ORM数据库初始化失败: {ex.Message}");
                // 实际项目中建议记录日志
                Debug.WriteLine($"SQLite初始化错误: {ex}");
            }
        }
       
 
        
     
        /// <summary>
        /// 从连接字符串中提取数据库文件的目录路径。
        /// 检查该目录是否存在，如果不存在则创建它。
        /// 调用 CreateTableIfNotExists() 方法创建 Persons 表（如果不存在）
        /// </summary>
        public static SqlSugarClient DbContext { get; } = new SqlSugarClient(new ConnectionConfig
        {
            //SqlSugarClient是一个数据库操作客户端，用于连接和操作数据库。
            //通过new SqlSugarClient(new ConnectionConfig {...})来初始化                      
                    ConnectionString = $"Data Source={DbPath};",//指定了数据库连接字符串
                     DbType = SqlSugar.DbType.Sqlite,//明确数据库类型为 SQLite SqlSugar 支持多种数据库（如 SQL Server、MySQL、Oracle 等）
                     IsAutoCloseConnection = true,//IsAutoCloseConnection设置为true表示自动关闭数据库连接；
                     InitKeyType = InitKeyType.Attribute //识别主键?不清楚识别原理 通过实体类的属性特性（如 [SugarColumn(IsPrimaryKey = true)]）？
        });      
                //只读，与const的区别就是能接收方法，只在初始化时可以赋值，重启程序，重新初始化可以改变赋值
        private  readonly SqlSugarClient db = SqlSugarManager.DbContext;
        public SqlSugarManager()
        {
            EnsureDatabaseInitialized();
            
        }
        /// <summary>
        /// CreateTableIfNotExists() 方法：
        /// 创建一个 SQLiteConnection 对象并打开连接。
        /// 创建一个 SQLiteCommand 对象db，设置其 CommandText 为创建 Persons 表的 SQL 语句。
        /// 执行 ExecuteNonQuery() 方法来执行 SQL 命令。
        /// </summary>
        private void CreateTableIfNotExists()
        {
            db.CodeFirst.InitTables(typeof(Person));//根据 Person 实体类的定义，自动创建对应的数据库表
                                                    // 如果表已存在，默认不会修改（可配置为自动更新）
                                                    // 支持一次性创建多个表（传入多个类型）；db.CodeFirst.InitTables(
                                                                                          //typeof(Person), 
                                                                                          //typeof(Order), 
                                                                                          //typeof(Product)
                                                                                          //  );  //一次性创建多个表
        }

        // 添加人员到数据库
        public void AddPerson(Person person)
        {
            // 插入并返回自增 Id
            var identity = db.Insertable(person).ExecuteReturnIdentity();
            person.Id = Convert.ToInt32(identity); // 将 Id 赋值给实体
    
        }

        // 从数据库中删除人员
        public void DeletePerson(string name)
        {
            db.Deleteable<Person>().Where(p => p.Name == name).ExecuteCommand();
        }

        // 修改数据库中的人员信息
        public void UpdatePerson(Person person)
        {
            db.Updateable(person).ExecuteCommand();
        }

        // 从数据库中获取所有人员信息
        public List<Person> GetAllPersons()
        {
            return db.Queryable<Person>().ToList();
        }

        // 使用原生 SQL 查询
        public List<Person> GetPersonsByNativeSql()
        {
            string sql = "SELECT * FROM Persons";
            return db.Ado.SqlQuery<Person>(sql);
        }
    }
}
